// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraCosmeticDeveloperSettings.h"
#include "Cosmetics/LyraCharacterPartTypes.h"
#include "Misc/App.h"
#include "Widgets/Notifications/SNotificationList.h"
#include "Framework/Notifications/NotificationManager.h"
#include "System/LyraDevelopmentStatics.h"
#include "TimerManager.h"
#include "Engine/Engine.h"
#include "LyraControllerComponent_CharacterParts.h"
#include "EngineUtils.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraCosmeticDeveloperSettings)

#define LOCTEXT_NAMESPACE "LyraCheats" // 定义本地化命名空间

ULyraCosmeticDeveloperSettings::ULyraCosmeticDeveloperSettings()
{
}

/**
 * 获取设置类别名称
 */
FName ULyraCosmeticDeveloperSettings::GetCategoryName() const
{
	return FApp::GetProjectName(); // 返回项目名称作为类别名
}

#if WITH_EDITOR // 如果在编辑器环境下

/**
 * 属性编辑改变后调用
 */
void ULyraCosmeticDeveloperSettings::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
	Super::PostEditChangeProperty(PropertyChangedEvent); // 调用父类方法

	ApplySettings(); // 应用设置
}

/**
 * 配置重新加载后调用
 */
void ULyraCosmeticDeveloperSettings::PostReloadConfig(FProperty* PropertyThatWasLoaded)
{
	Super::PostReloadConfig(PropertyThatWasLoaded); // 调用父类方法

	ApplySettings(); // 应用设置
}

/**
 * 属性初始化后调用
 */
void ULyraCosmeticDeveloperSettings::PostInitProperties()
{
	Super::PostInitProperties(); // 调用父类方法

	ApplySettings(); // 应用设置
}

/**
 * 应用设置
 */
void ULyraCosmeticDeveloperSettings::ApplySettings()
{
	if (GIsEditor && (GEngine != nullptr)) // 如果是编辑器环境且引擎有效
	{
		ReapplyLoadoutIfInPIE(); // 如果在PIE中，则重新应用装备
	}
}

/**
 * 如果在PIE中，则重新应用装备
 */
void ULyraCosmeticDeveloperSettings::ReapplyLoadoutIfInPIE()
{
#if WITH_SERVER_CODE // 如果有服务器代码
	// 更新所有玩家的装备
	UWorld* ServerWorld = ULyraDevelopmentStatics::FindPlayInEditorAuthorityWorld(); // 查找PIE权限世界
	if (ServerWorld != nullptr) // 如果找到了世界
	{
		ServerWorld->GetTimerManager().SetTimerForNextTick(FTimerDelegate::CreateLambda([=]() // 设置下一帧执行的定时器委托
			{
				for (TActorIterator<APlayerController> PCIterator(ServerWorld); PCIterator; ++PCIterator) // 遍历世界中的玩家控制器
				{
					if (APlayerController* PC = *PCIterator) // 获取玩家控制器指针
					{
						if (ULyraControllerComponent_CharacterParts* CosmeticComponent = PC->FindComponentByClass<ULyraControllerComponent_CharacterParts>()) // 查找化妆组件
						{
							CosmeticComponent->ApplyDeveloperSettings(); // 应用开发者设置
						}
					}
				}
			}));
	}
#endif	// WITH_SERVER_CODE
}

/**
 * PIE开始时调用，用于显示提醒通知
 */
void ULyraCosmeticDeveloperSettings::OnPlayInEditorStarted() const
{
	// 显示通知Toast以提醒用户有体验覆盖设置
	if (CheatCosmeticCharacterParts.Num() > 0) // 如果有作弊化妆角色部件
	{
		FNotificationInfo Info(LOCTEXT("CosmeticOverrideActive", "Applying Cosmetic Override")); // 创建通知信息
		Info.ExpireDuration = 2.0f; // 设置过期时间
		FSlateNotificationManager::Get().AddNotification(Info); // 添加通知
	}
}

#endif // WITH_EDITOR

#undef LOCTEXT_NAMESPACE // 取消定义本地化命名空间